<?php
/**
 * Table.php
 * 表格数据 API
 * @author Deepseath
 * @version $Id$
 */
namespace deepseath\huoban\Api;

class Table
{
    /**
     * 基类服务对象
     * @var \deepseath\huoban\Huoban
     */
    protected $service = null;

    public function __construct(\deepseath\huoban\Huoban $service)
    {
        $this->service = $service;
    }

    /**
     * 获取表格列表
     * @see https://help.huoban.com/5?page_id=208
     * @param int   $spaceId    工作区ID
     * @param array $exendData  限制接口返回的字段数量
     * <pre>
     * X-Huoban-Return-Fields:["table_id", "name", "alias", "type",  "space_id"]
     * </pre>
     * @return array
     * <pre>
     * table_id bigint  表格ID
     * name     string  表格名称
     * alias    string  表格别名，别名设置方法参考 别名设置
     * type     string  表格类型。普通表格：normal，数据仓库反向同步表：sync
     * space_Id bigint  表格所属工作区ID
     * </pre>
     */
    public function ls(int $spaceId, array $exendData = []) : array
    {
        $path = 'tables/space/' . $spaceId;
        if (empty($exendData)) {
            $exendData = [
                'X-Huoban-Return-Fields' => '["table_id", "name", "alias", "type",  "space_id"]'
            ];
        }

        return $this->service->apiRequest('get', $path, [], $exendData);
    }

    public function tableAlias($table)
    {
        return 'T::' . $table;
    }

    /**
     * 获取指定表格详情
     * @see https://help.huoban.com/5?page_id=209
     * @param mixed $table 可以是表格 ID，也可以是表格别名，如果是表格别名，则需要使用 $this->tableAlias() 方法修饰参数
     * @return array
     */
    public function get($table) : array
    {
        $path = 'table/' . $table;
        return $this->service->apiRequest('get', $path, [], []);
    }

    /**
     * 创建单条数据
     * @see https://help.huoban.com/5?page_id=221
     * @param mixed $table  可以是表格 ID，也可以是表格别名，如果是表格别名，则需要使用 $this->tableAlias() 方法修饰参数
     * @param array $fields 数据字段值，参考 item数据说明
     * @return array
     */
    public function insert($table, array $fields) : array
    {
        $path = 'item/table/' . $table;

        return $this->service->apiRequest('post', $path, $fields, []);
    }

    /**
     * 批量创建数据
     * @see https://help.huoban.com/5?page_id=228
     * @param mixed $table 可以是表格 ID，也可以是表格别名，如果是表格别名，则需要使用 $this->tableAlias() 方法修饰参数
     * @param mixed $spaceId 工作区ID
     * @param array $data
     * @return array
     */
    public function create($table, array $data = []) : array
    {
        $path = 'item/table/' . $table . '/create';

        return $this->service->apiRequest('post', $path, $data, []);
    }

    /**
     * 获取单条数据
     * @see https://help.huoban.com/5?page_id=223
     * @param int $itemId 数据 ID
     * @return array
     */
    public function fetch($itemId) : array
    {
        $path = 'item/' . $itemId;
        return $this->service->apiRequest('get', $path, []);
    }

    /**
     * 更新单条数据
     * @see https://help.huoban.com/5?page_id=224
     * @param int $itemId 数据 ID
     * @param array $fields 新字段值对象。您只需要传递要更新的字段值。传null表示清空指定字段的值
     * @return array
     */
    public function update($itemId, array $fields) : array
    {
        $path = 'item/' . $itemId;
        return $this->service->apiRequest('put', $path, $fields);
    }

    /**
     * 获取表格数据列表
     * @see https://help.huoban.com/5?page_id=220
     * @param array $itemids   item_id 列表
     * @return array
     */
    public function find($tableId, array $itemids, $limit = 100) : array
    {
        $path = 'item/table/' . $tableId . '/find';
        return $this->service->apiRequest('post', $path, [
            'where' => [
                'field' => 'item_id',
                'query' => [
                    'in' => $itemids
                ]
            ],
            'limit' => $limit
        ]);
    }

    /**
     * 批量删除指定 id 的数据
     * @param string $tableId
     * @param array $itemIds
     * @return array|string
     */
    public function remove(string $tableId, array $itemIds)
    {
        $path = 'item/table/' . $tableId . '/delete';
        return $this->service->apiRequest('post', $path, [
            'item_ids' => $itemIds
        ]);
    }

    /**
     * 按照指定字段顺序排序，列出指定表格全部数据
     *
     * @param integer $tableId
     * @param integer $orderbyFiledId
     * @param integer $offet
     * @param integer $limit
     * @return array
     */
    public function datas(int $tableId, int $orderbyFiledId, int $offet = 0, int $limit = 100, array $where = [])
    {
        $path = 'item/table/' . $tableId . '/find';
        $options = [
            'offset' => $offet,
            'limit' => $limit,
            'order_by' => [
                'field' => $orderbyFiledId,
                'sort' => 'asc'
            ]
        ];
        if (!empty($where)) {
            $options['where'] = $where;
        }
        return $this->service->apiRequest('post', $path, $options);
    }

    /**
     * 按照指定字段排序，列出指定表格全部数据
     *
     * @param integer $tableId
     * @param array $orderby
     * @param integer $offet
     * @param integer $limit
     * @param array $where
     * @return array
     */
    public function list(int $tableId, array $orderby, int $offet = 0, int $limit = 100, array $where = [])
    {
        $path = 'item/table/' . $tableId . '/find';
        $options = [
            'offset' => $offet,
            'limit' => $limit,
        ];
        if (!empty($orderby)) {
            $options['order_by'] = $orderby;
        }
        if (!empty($where)) {
            $options['where'] = $where;
        }
        return $this->service->apiRequest('post', $path, $options);
    }
}
